#!/bin/bash
# 文件名：select_usb_card_reader.sh
# 功能说明：
# 本脚本用于检测并列出所有通过 USB 连接的 SD 读卡器设备，
# 并提供交互式选择界面，让用户选择一个设备。
#
# 实现方式：
# 1. 使用 `lsblk` 命令筛选出连接方式为 USB 且类型为磁盘的设备
# 2. 显示所有 USB 读卡器设备的详细信息
# 3. 提示用户输入设备名称进行选择，并验证输入是否有效
#
# 适用范围：
# - 适用于 Linux 系统（依赖 `lsblk` 和 `awk`）
# - 适用于通过 USB 连接的 SD 读卡器设备
#
# 依赖：
# - 需要 `lsblk` 命令来获取设备信息
# - 需要对 `/dev` 设备具有读取权限
#
# 退出状态：
# - 0: 成功运行并选择了设备
# - 1: 没有找到可用的 USB 读卡器设备
#
# 使用方法：
# 直接运行脚本，它会检测 USB 读卡器并提示用户进行选择：
#   ./select_usb_card_reader.sh
#
# 用户可以输入磁盘名称（如 sdb）进行选择，也可以直接回车退出程序。

# 获取所有通过 USB 连接的 SD 读卡器设备
get_usb_card_readers() {
    lsblk -d -o NAME,TRAN,TYPE | awk '$2 == "usb" && $3 == "disk" {print "/dev/" $1}'
}

# 让用户选择设备
select_disk() {
    local disks=("$@")
    while true; do
        echo "🔍 检测到以下 USB 读卡器设备："
        lsblk -d "${disks[@]}" -o NAME,RM,SIZE,TYPE,MODEL,SERIAL

        echo "请输入设备名称（如 sdb），或直接回车退出："
        read -r disk_name
        [[ -z $disk_name ]] && exit 0

        local selected_disk="/dev/$disk_name"
        for disk in "${disks[@]}"; do
            if [[ $disk == "$selected_disk" ]]; then
                echo "✅ 选中设备：$selected_disk"
                return 0
            fi
        done

        echo "⚠️ 无效设备，请重新输入！"
    done
}

# 主流程
main() {
    local usb_readers
    usb_readers=($(get_usb_card_readers))

    if [[ ${#usb_readers[@]} -eq 0 ]]; then
        echo "❌ 未检测到 USB 读卡器设备。"
        exit 1
    fi

    select_disk "${usb_readers[@]}"
}

main

